Aula 2 - Manipulação de dados

Introdução ao Tidyverse

Lucas Fernandes de Magalhães

Utilizando pacotes

Instalando e carregando pacotes

   

O R possui uma série de funções que já vêm junto com a sua instalação, como a mean(), seq(), round(), c(), data.frame() e as demais já utilizadas.

Para utilizar outras funções além dessas, é preciso instalar pacotes ou bibliotecas e carregá-las.

   

#install.packages("tidyverse")
#install.packages("rio")
#library(tidyverse)
#library(rio)

Obs: Os pacotes devem ser carregados toda vez que o R for iniciado

Utilizando as funções dos pacotes

   

Existem duas formas de se utilizar as funções dos pacotes.

   

  • A primeira delas já foi explicada. Basta instalar e carregar o pacote que as funções já podem ser imediatamente utilizadas.

  • A segunda é utilizando o nome do pacote seguido de dois pontos duplicados -> dplyr:: OU rio::

Caso surja alguma dúvida a respeito do pacote instalado, uma boa opção é consultar o site abaixo:
R Package Documentation

Utilizando dados externos ao R

Escolhendo o diretório - 1ª opção

   

Escolhendo o diretório - 2ª opção

   

É possível identificar o diretório em que o R está operando utilizando a função getwd()

getwd()
## [1] "T:/COVAD/Curso R/Aula 2"

   

E alterar o diretório utilizando a função setwd().

setwd("C:\\Users\\t0080390\\Downloads\\curso_r\\aula2") #1º forma
setwd("C:/Users/t0080390/Downloads/curso_r/aula2") #2º forma

IMPORTANTE: as barras do caminho do diretório devem ser duplicadas ou invertidas

Importando planilhas

   

Para utilizar uma planilha de excel no R devemos importá-la para o ambiente.

   

Existem diversas funções para importar planilhas, incluindo algumas próprias do R (como a read.csv ou read.csv2).

   

No entanto, iremos utilizar a função import() do pacote rio que já foi instalado, uma vez que ela permite a importação de um maior número de extensões de documentos (.csv, .xslx, .ods, etc.)

Importando planilhas

Existem dois modos de se importar uma planilha:

#O primeiro deles é fixando o diretório e depois utilizar a função import()
setwd("T:\\COVAD\\Curso R\\Aula 2")
jn <- import("jn.xlsx") #Base do relatório Justiça em Números 2019

head(jn[1:5])
##    ano   justica  sigla dsc_tribunal uf_sede
## 1 2009  Estadual   TJAC    TJ - Acre      AC
## 2 2010  Estadual   TJAC    TJ - Acre      AC
## 3 2011 Eleitoral TRE-AC   TRE - Acre      AC
## 4 2011  Estadual   TJAC    TJ - Acre      AC
## 5 2012 Eleitoral TRE-AC   TRE - Acre      AC
## 6 2012  Estadual   TJAC    TJ - Acre      AC
#O segundo é inserindo o caminho do diretório diretamente na função
jn <- import("T:\\COVAD\\Curso R\\Aula 2\\jn.xlsx")
head(jn[1:5])
##    ano   justica  sigla dsc_tribunal uf_sede
## 1 2009  Estadual   TJAC    TJ - Acre      AC
## 2 2010  Estadual   TJAC    TJ - Acre      AC
## 3 2011 Eleitoral TRE-AC   TRE - Acre      AC
## 4 2011  Estadual   TJAC    TJ - Acre      AC
## 5 2012 Eleitoral TRE-AC   TRE - Acre      AC
## 6 2012  Estadual   TJAC    TJ - Acre      AC

Exportando planilhas

   

As planilhas também podem ser exportadas para o diretório desejado utilizando a função export()

   

#O primeiro deles é fixando o diretório e depois utilizar a função export()
#setwd("T:\\COVAD\\Curso R\\Aula 2")
#export(jn, "teste1.csv") #Base do relatório Justiça em Números 2019

#O segundo é inserindo o caminho do diretório diretamente na função
#export(jn, "T:\\COVAD\\Curso R\\Aula 2\\teste2.csv")

#É possível também salvar a planilha em outra extensão, como xlsx:
#export(jn, "T:\\COVAD\\Curso R\\Aula 2\\teste3.xlsx")

Introdução ao Tidyverse

Dplyr

   

Nesta aula, focaremos nos pacotes Dplyr e Tidyr, mas ainda passaremos pelo ggplot e stringr nas próximas.

O Dplyr (d para data frames e plyr para pliers) é a gramática da manipulação de dados, contendo uma série de verbos (funções) que permitem resolver a maior parte dos desafios relacionados à manipulação.

Ao longo desta aula, passaremos pelas seguintes funções:

   

  • filter()

  • slice ()

  • select()

  • arrange()

  • mutate()

  • summarise()

  • group_by()

Select()

Selecionando as colunas da planilha - Revisão

   

Na primeira aula, aprendemos a selecionar as colunas de uma base utilizando colchetes

   

#Selecionar as colunas pelo indexador

jn1 <- jn[,c(1,2,3)]
dim(jn1)
## [1] 890   3
#Selecionar as colunas pelos nomes

jn1 <- jn[,c("ano", "justica","sigla")]
dim(jn1)
## [1] 890   3

Selecionando as colunas da planilha com select()

IMPORTANTE: o primeiro argumento de todas as funções é sempre a base de dados

   

Para selecionar colunas com o dplyr basta usar a função select()

#Selecionar as colunas pelo indexador
jn1 <- select(jn, 1,2,3)
dim(jn1)
## [1] 890   3
#Selecionar as colunas pelos nomes
jn1 <- select(jn, ano, justica, sigla)
dim(jn1)
## [1] 890   3
#Selecionar as colunas pelo conteúdo do seu nome
jn1 <- select(jn, starts_with("arq"))

Excluindo colunas

   

Para excluir colunas, basta incluir um sinal de negativo (-) antes do nome da coluna

dim(jn)
## [1]  890 1456
jn1 <- select(jn, -starts_with("arq"))
dim(jn1)
## [1]  890 1449

   

Para os próximos exercícios, selecione as seguintes colunas: ano, justica, sigla, uf_sede, uf_abrangida, ftt, g1, g10a, g10b, g10c, g10d

jn <- select(jn, ano, justica, sigla,regiao, starts_with("uf"),ftt, g1, starts_with("g10"))

Filter()

Filtrando colunas com colchetes - revisão

   

jn1 <- jn[jn$ano==2018,]
head(jn1[1:5], n=5)
##     ano   justica  sigla   regiao uf_sede
## 17 2018 Eleitoral TRE-AC    Norte      AC
## 18 2018  Estadual   TJAC    Norte      AC
## 44 2018 Eleitoral TRE-AL Nordeste      AL
## 45 2018  Estadual   TJAL Nordeste      AL
## 46 2018  Trabalho  TRT19 Nordeste      AL
jn1 <- jn[jn$uf_abrangida=="Nordeste",]
head(jn1[1:5], n=5)
##     ano  justica sigla   regiao uf_sede
## 19 2009 Estadual  TJAL Nordeste      AL
## 21 2010 Estadual  TJAL Nordeste      AL
## 24 2011 Estadual  TJAL Nordeste      AL
## 27 2012 Estadual  TJAL Nordeste      AL
## 30 2013 Estadual  TJAL Nordeste      AL

Filtrando colunas com o dplyr

   

Antes de aprendermos a filtrar, precisamos conhecer os operadores de comparação utilizados no R:

   

  • Igualdade: \(==\)

  • Diferença: \(!=\)

  • Menor que: \(<\)

  • Maior que: \(>\)

  • Menor ou igual: \(<=\)

  • Maior ou igual: \(>=\)

Filtrando colunas com o dplyr

   

Lembrem-se, o primeiro argumento das funções do dplyr é SEMPRE A BASE DE DADOS

   

jn1 <- filter(jn, ano >= 2016)

jn1 <- filter(jn, uf_abrangida == "Sudeste")

jn1 <- filter(jn, uf_abrangida != "Nordeste")

Filtrando múltiplas colunas

É possível filtrar por múltiplas colunas ao mesmo tempo. Para tanto, além dos operadores de comparação, temos que conhecer também os operadores lógicos: “”

  • “&” ou a vírgula (,) são sinônimos de E, isto é, filtra apenas as observações que cumprem as duas condições

  • “|” é um sinônimo de OU, ou seja, filtra as observações que cumprem uma observação ou a outra

Filtrando múltiplas colunas

   

jn1 <- filter(jn, ano == 2016 &  uf_sede == "SP")
nrow(jn1)
## [1] 6
jn1 <- filter(jn, ano == 2016 |  uf_sede == "SP")
nrow(jn1)
## [1] 146

Filtrando por múltiplos valores

   

Para filtrar múltiplos valores de uma única coluna é necessário usar o operador %in%

   

jn1 <- filter(jn, ano %in% c(2016,2018))

jn1 <- filter(jn, sigla %in% c("TJMG", "TJSP", "TJRJ", "TJRS") &
                g10d>7000)

Slice()

Selecionando linhas

   

A função slice() serve para selecionar linhas específicas da base de dados

   

jn1 <- slice(jn, 1:5) #seleciona da primeira à quinta linha


jn1 <- slice(jn, 890:n()) #seleciona da 890 à última linha



jn1 <- slice(jn, -1:-4) #Exclui as 4 primeiras linhas

Arrange()

Ordenando a base de dados

   

A função arrange() corresponde à classificação da base de dados a partir dos valores das colunas. Assim como no Excel, é possível classificar uma ou mais colunas em ordem crescente ou decrescente (basta colocar o nome da coluna dentro do argumento desc()).

jn1 <- arrange(jn, ano, uf_sede)
head(jn1, n=5)
##    ano  justica sigla   regiao uf_sede       uf_abrangida  ftt          g1
## 1 2009 Estadual  TJAC    Norte      AC              Norte 1813 0.014827827
## 2 2009 Estadual  TJAL Nordeste      AL           Nordeste 2426 0.006583269
## 3 2009 Trabalho TRT19 Nordeste      AL            Alagoas  793 0.004438447
## 4 2009 Estadual  TJAM    Norte      AM              Norte 2650 0.004294022
## 5 2009 Trabalho TRT11    Norte      AM Amazonas e Roraima 1203 0.004107223
##   g10a g10b     g10c     g10d
## 1   NA   NA       NA 2658.065
## 2   NA   NA 18117.33 4369.663
## 3   NA   NA 16748.71 8057.550
## 4   NA   NA 22532.21 5064.874
## 5   NA   NA 32207.87       NA
jn1 <- arrange(jn, desc(ano), ftt)
head(jn1, n=5)
##    ano          justica  sigla  regiao uf_sede      uf_abrangida ftt
## 1 2018 Militar Estadual  TJMRS     Sul      RS Rio Grande do Sul 141
## 2 2018 Militar Estadual  TJMMG Sudeste      MG      Minas Gerais 179
## 3 2018        Eleitoral TRE-RR   Norte      RR           Roraima 247
## 4 2018 Militar Estadual  TJMSP Sudeste      SP         São Paulo 258
## 5 2018        Eleitoral TRE-AC   Norte      AC              Acre 261
##             g1     g10a     g10b     g10c      g10d
## 1 7.354124e-05 608144.0 125218.3 36757.04  7706.516
## 2 9.493060e-05 784555.4 227058.2 43905.69  9689.269
## 3 4.305523e-03 128028.3 253306.8 50116.18  1766.383
## 4 3.088603e-05 567693.5 179676.6 36326.23 11193.814
## 5 4.492207e-03 113856.8 225363.4 33220.20 10688.216

Mutate()

Criando novas colunas

   

O objetivo da função mutate() é permitir criar novas colunas a partir das já existentes

   

#Criar uma nova coluna que corresponde à média de despesa por funcionário
jn1 <- mutate(jn, med_func= (g10a+g10b+g10c+g10d)/4)



#Criar uma nova coluna que corresponde a quantas vezes as categorias de funcionários ganham em relação às outras

jn1 <- mutate(jn, mag_serv= (g10a/g10b), serv_terc=(g10b/g10c), terc_est=(g10c/g10d))
jn1 %>% filter (ano==2017, justica=="Estadual") %>% select(3,13,14,15) %>%  head(n=5)
##   sigla mag_serv serv_terc  terc_est
## 1  TJAC 5.530942  4.487870  1.296539
## 2  TJAL 4.453916  3.477776  2.334373
## 3  TJAM 3.243453  1.238992 17.435706
## 4  TJAP 3.636119  5.547056  3.861168
## 5  TJBA 3.296825  4.895988  4.832222

Summarise()

Estatísticas sumárias da base

   

A função summarise() visa obter estatísticas da base por colunas

Summarise()

Por exemplo, podemos obter a média das despesas por magistrados, servidores, terceirizados ou estagiários

summarise(jn, media_mag=mean(g10a, na.rm=T))
##   media_mag
## 1  416383.1
summarise(jn, media_serv=mean(g10b, na.rm=T))
##   media_serv
## 1   186989.7
summarise(jn, media_ter=mean(g10c, na.rm=T))
##   media_ter
## 1  38330.61
summarise(jn, media_est=mean(g10d, na.rm=T))
##   media_est
## 1  9642.114

group_by()

Realizando manipulações por grupo

   

Todas as manipulações realizadas até então podem ser aplicadas a grupos, ao invés de aplicadas à base de dados inteira

Combinando o group_by com as outras funções

   

Como descobrir quais são 5 Tribunais que pagam os melhores salários aos servidores em 2018?

jn1 <- filter(jn, ano==2018)
jn1 <- arrange(jn1, desc(g10b))
jn1 <- slice(jn1, 1:5) #Esses códigos podem ser substituídos pela função top_n
jn1$sigla
## [1] "TRE-AP" "JMU"    "STM"    "TRT10"  "TRT12"

Como descobrir quais são 3 Tribunais que pagam os melhores salários aos servidores por justiça?

jn1 <- filter(jn, ano==2018)
jn1 <- group_by(jn1, justica) #Agrupando por justiça
jn1 <- arrange(jn1, desc(g10b)) #Após agrupar, o restante do algoritmo é o mesmo
jn1 <- slice(jn1, 1:3)
jn1[c(2,3)]
## # A tibble: 19 x 2
## # Groups:   justica [7]
##    justica          sigla 
##    <chr>            <chr> 
##  1 Eleitoral        TRE-AP
##  2 Eleitoral        TRE-RN
##  3 Eleitoral        TRE-AL
##  4 Estadual         TJDFT 
##  5 Estadual         TJBA  
##  6 Estadual         TJTO  
##  7 Federal          TRF4  
##  8 Federal          TRF   
##  9 Federal          TRF2  
## 10 Militar Estadual TJMMG 
## 11 Militar Estadual TJMSP 
## 12 Militar Estadual TJM   
## 13 Militar Uniao    JMU   
## 14 Superior         STM   
## 15 Superior         STJ   
## 16 Superior         TSE   
## 17 Trabalho         TRT10 
## 18 Trabalho         TRT12 
## 19 Trabalho         TRT1

Combinando o group_by com as outras funções

Já calculamos qual é a média geral dos salários dos servidores. Agora, qual é a média dos salários dos servidores por região em 2018?

jn1 <- filter(jn, ano==2018)
jn1 <- group_by(jn1, regiao)
jn1 <- summarise(jn1, med_venc=mean(g10b, na.rm=T))
jn1 <- arrange(jn1, desc(med_venc))
jn1
## # A tibble: 6 x 2
##   regiao       med_venc
##   <chr>           <dbl>
## 1 União         236680.
## 2 Sul           208886.
## 3 Norte         208337.
## 4 Sudeste       208139.
## 5 Nordeste      201151.
## 6 Centro-Oeste  198556.

E por justiça?

jn1 <- filter(jn, ano==2018)
jn1 <- group_by(jn1, justica)
jn1 <- summarise(jn1, med_venc=mean(g10b, na.rm=T))
jn1 <- arrange(jn1, desc(med_venc))
jn1
## # A tibble: 7 x 2
##   justica          med_venc
##   <chr>               <dbl>
## 1 Militar Uniao     302120.
## 2 Superior          265222.
## 3 Trabalho          248232.
## 4 Federal           245277.
## 5 Eleitoral         207063.
## 6 Militar Estadual  177839.
## 7 Estadual          162892.

Combinando o group_by com as outras funções

   

E por justiça e região? Sim, é possível agrupar por mais de uma coluna

jn1 <- filter(jn, ano==2018)
jn1 <- group_by(jn1, justica, regiao)
jn1 <- summarise(jn1, med_venc=mean(g10b, na.rm=T))
jn1 <- arrange(jn1, desc(med_venc), justica, regiao)
jn1
## # A tibble: 27 x 3
## # Groups:   justica [7]
##    justica       regiao       med_venc
##    <chr>         <chr>           <dbl>
##  1 Militar Uniao União         302120.
##  2 Trabalho      União         272687.
##  3 Superior      União         265222.
##  4 Federal       Sul           262558.
##  5 Trabalho      Sul           261326.
##  6 Trabalho      Norte         248115.
##  7 Trabalho      Sudeste       247045.
##  8 Federal       Sudeste       243577.
##  9 Federal       União         242590.
## 10 Trabalho      Centro-Oeste  241756.
## # ... with 17 more rows

Bônus: pipe %>%

Aninhando funções

   

Em várias situações, precisaremos utilizar várias funções para completar um único objetivo: média de salário dos serviores por região, por exemplo.

Para evitar termos que criar vários objetos ou sobrescrever um deles várias vezes, podemos aninhar funções.

#Calcular a média da proporção de salários dos magistrados em relação aos servidores por região em 2018

jn1 <-   arrange(summarise(group_by(mutate(filter(jn, ano==2018), mag_serv=g10a/g10b), regiao),med_mag_serv=mean(mag_serv, na.rm = T)), desc(med_mag_serv))
jn1
## # A tibble: 6 x 2
##   regiao       med_mag_serv
##   <chr>               <dbl>
## 1 Centro-Oeste         2.57
## 2 Sul                  2.46
## 3 Sudeste              2.22
## 4 Norte                2.15
## 5 Nordeste             2.15
## 6 União                1.98

Aninhando funções com o pipe

   

Ao invés de concatenar inúmeras funções deixando o código totalmente ilegível, podemos usar o operador pipe \(%>%\) através do atalho ctrl+shift+m.

Em termos simples, o operador pipe “pega” o resultado da operação anterior e o utiliza como o input do primeiro argumento da função seguinte. É justamente por isso que ele é tão útil combinado com as funções do dplyr: todas as funções geram um data frame e demandam como primeiro argumento um data frame!!!

   

Aninhando funções com o pipe

jn1 <- jn %>% filter(ano==2018) %>% mutate(mag_serv=g10a/g10b) %>% 
              group_by(regiao) %>% summarise(med_mag_serv=mean(mag_serv, na.rm = T)) %>% 
              arrange(desc(med_mag_serv))
jn1
## # A tibble: 6 x 2
##   regiao       med_mag_serv
##   <chr>               <dbl>
## 1 Centro-Oeste         2.57
## 2 Sul                  2.46
## 3 Sudeste              2.22
## 4 Norte                2.15
## 5 Nordeste             2.15
## 6 União                1.98